总体框架
裸机框架调度管理4个模块：人机交互、传感器管理、电池管理、物联网。
人机交互包括：主界面、当前颗粒物界面、历史颗粒物界面、网络界面、熄屏状态。
采用前后台调度方案：主流程配合定时器中断流程实现，基于时间片周期实现各个功能模块。
在定时器中断设置时间片中断标志，在主流程判断标志是否为真再调度相应功能模块！

3种调度方案！1）实现1个裸机调度框架，框架对应一个数据结构，用来描述各个功能模块属性！
/*
run 定时器中断中使用，主流程中清零。
timCount 初始化时赋1个初始值，例如1000，表示一千毫秒，单位毫秒。递减，当数值为0，将run值设为1.
timRload 当timCount计数到0，使用重装载值重新对timCount赋值。
*/

typedef struct
{
    uint8_t run;          //调度标志。1：调度  0挂起
    uint16_t timCount;    //时间片计数值    
    uint16_t timRload;    //时间片重装载
    void (*pTaskFuncCb)(void);    //函数指针变量，用来保存业务功能模块函数地址
}TaskComps_t;
/*
4个功能模块！功能模块对应初始化如下：
关于功能模块数值大小，根据实际开发调整！
*/
static TaskComps_t g_taskComps[] = 
{
    {0,5,5,        HmiTask},
    {0,10,10,      WifiNetworkTask},
    {0,100,100,    SensorTask},
    (0,1000,1000,  BatteryTask),
    /*添加业务功能模块*/
};

1、人机交互界面

流程描述：
5个界面：默认主界面，单击切换页面，网络状态界面双击进入配网页面。当处于主界面、当前数据界面、历史数据界面、网络状态界面除了（配网界面）长按进入熄屏状态，再单击进入熄屏前界面。
软件流程图：

网络状态界面软件设计稍麻烦！
几个.c文件，交互框架对应hmi_app.c获取按键扫描结果，根据结果切换动作。切换时调用各个界面接口函数（详见软件工程）
函数参数不要超过4个，超过就要放在内存栈当中。

2、LCD驱动
字库取模！
uint16_t bkColor;  背景颜色。单一颜色，背景像素点为0。
uint16_t textColor; 文字颜色。对应像素点为1。
注意数字和大小写英文字符取舍！根据实际情况，较少单片机资源消耗。
数据结构成员增减根据实际开发需要添减！
ASCII可以全部取模，汉字只能用什么取什么！

3、按键驱动和API接口
状态机 + 定时器实现按键扫描！ 3种状态：单击、双击、长按。（多连击）
不能用delay、阻塞延时等消抖，做长按判断！

按键流程图：

代码实现，基于switch case
情况：根据产品不同需求定义：1）按下马上就执行业务逻辑  2）手松开才执行业务逻辑  2种情况可通过状态机实现，具体看产品体验定义具体操作。此项目实际，当手松开就执行业务逻辑。
重点：状态和状态切换条件、有几种状态。

4、物联网
物联网应用层入口函数:基于状态机实现，调度框架中10ms调度1次。
WifiNetworkTask()
AT通信检查：硬件初始化、检查硬件通信是否正常
网络检查连接、接收发送数据，2个状态需长时间，可触发配网操作。AT通信检查和MQTT瞬时就完成了。
Wifi应用API接口，2个

Wifi驱动API接口，5个


5、电池管理模块
应用层入口函数：调度框架中1000ms调用1次，触发电池驱动层生产电池点亮和状态相关数据。
BarrtyTask()

电池驱动API接口

6、传感器管理
















